package repertorioInstrucciones;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;
import java.util.ArrayList;

import comun.Natural;

import maquina.Dato;
import maquina.Pila;
import maquina.PilaTrabajo;

public class Stdin extends Instruccion {


	public Stdin (int dir){
		super(dir);
	}
	
	public PilaTrabajo accion(PilaTrabajo pilaT) {
		//leo el valor por pantalla
		Reader entrada = new InputStreamReader(System.in);
		BufferedReader bufferIn = new BufferedReader(entrada);
		String bufferEntrada = null;
		String clase = ((Dato) pilaT.getMem().get((Integer) this.parametros.get(0))).getDato().getClass().toString();
		String[] claseS = clase.split("lang");
		clase = claseS[1].substring(1);
		System.out.print(" Introduce un valor de tipo: "+ clase  );
		try {
			bufferEntrada = bufferIn.readLine();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		Dato d = (Dato) pilaT.getMem().get((Integer) this.parametros.get(0));
		if ( d.getDato() instanceof Natural){
			try{
				if(Integer.valueOf(bufferEntrada)>=0){
					Dato<Integer> d2 = new Dato<Integer>(Integer.valueOf(bufferEntrada));
					pilaT.getPila().push(d2);
				}
				else throw new NumberFormatException();

			}
			catch (NumberFormatException ex){
				System.err.println("Tipo incompatible, se esperaba NATURAL");
				System.exit(-1);
			}
		}
		else if ( d.getDato() instanceof Integer){
			try{
				Dato<Integer> d2 = new Dato<Integer>(Integer.valueOf(bufferEntrada));
				pilaT.getPila().push(d2);
			}
			catch (NumberFormatException ex){
				System.err.println("Tipo incompatible, se esperaba INTEGER");
				System.exit(-1);
			}
		}
		else if ( d.getDato() instanceof Float){
			try{
				Dato<Float> d2 = new Dato<Float>(Float.valueOf(bufferEntrada));
				pilaT.getPila().push(d2);
			}
			catch (NumberFormatException ex){
				System.err.println("Tipo incompatible, se esperaba Real");
				System.exit(-1);
			}
		}
		else if ( d.getDato() instanceof Boolean){
			try{
				if (bufferEntrada.equals("verdadero")){
					Dato<Boolean> d2 = new Dato<Boolean>(true);
					pilaT.getPila().push(d2);
				}
				else if (bufferEntrada.equals("falso")){
					Dato<Boolean> d2 = new Dato<Boolean>(false);
					pilaT.getPila().push(d2);					
				}				
				else throw new NumberFormatException();
			}
			catch (NumberFormatException ex){
				System.err.println("Tipo incompatible, se esperaba Boolean");
				System.exit(-1);
			}
		}
		else if (d.getDato() instanceof Character){
			try{
				if(bufferEntrada.length()>1)throw new NumberFormatException();
				else{
					int c =  Integer.valueOf(bufferEntrada);
					char car = (char)c;
					Dato<Character> d2 = new Dato<Character>(car);
					pilaT.getPila().push(d2);
				}
			}
			catch (NumberFormatException ex){
				System.err.println("Tipo incompatible, se esperaba Caracter");
				System.exit(-1);
			}
		}

		return pilaT;
	}
}
